package com.sky.robot.frame.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.sky.robot.commons.utils.PropertiesUtils;
import com.sky.robot.frame.domain.SkyTableDo;
import com.sky.robot.frame.entity.SkyTable;
import com.sky.robot.frame.entity.SkyTableColumn;
import com.sky.robot.frame.mapper.SkyTableColumnMapper;
import com.sky.robot.frame.mapper.SkyTableMapper;
import com.sky.robot.frame.service.SkyTableService;
import com.sky.robot.frame.utils.CoreUtil;
import com.sky.robot.frame.utils.JSONUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

@Service
public class SkyTableServiceImpl extends ServiceImpl<SkyTableMapper, SkyTable> implements SkyTableService {

    @Autowired
    private SkyTableColumnMapper skyTableColumnMapper;

    @Autowired
    private SkyTableMapper skyTableMapper;

    @Override
    @Transactional
    public IPage<SkyTable> listPage(IPage page, Map<String, Object> map) {
        // 查询分页数据
        List<SkyTable> list = skyTableMapper.listPage(page, map);
        // 查询一共多少行数据
        Map<String, Object> mPage = skyTableMapper.sum(map);
        page.setRecords(list);
        page.setTotal((long) mPage.get("total"));
        return page;
    }

    @Override
    @Transactional(readOnly = true)
    public Object get(Map<String, Object> params) {
        String id = (String) params.get("id");
        SkyTable skyTable = getById(id);
        if (skyTable != null) {
            String json = JSONUtil.beanToJson(skyTable);
            Map<String, Object> map = JSONUtil.jsonToMap(json);
            map.putAll(params);
            params = map;
        }
        return params;
    }


    @Override
    @Transactional
    public SkyTable add(SkyTable skyTable) {
        save(skyTable);
        return skyTable;
    }

    @Override
    @Transactional
    public SkyTable edit(SkyTable skyTable) {
        updateById(skyTable);
        return skyTable;
    }

    @Override
    @Transactional
    public Object delete(String id) {
        removeById(id);
        return null;
    }

    @Override
    @Transactional
    public Object deleteBatch(String ids) {
        List<String> idList = new ArrayList<>();
        Collections.addAll(idList, ids.split(","));
        removeByIds(idList);
        return null;
    }

    /**
     * 创建表结构
     */
    @Override
    @Transactional
    public Object createTable(SkyTableDo skyTableDo) {
        if (skyTableDo == null) {
            return null;
        }
        boolean existsTable = Boolean.parseBoolean(PropertiesUtils.getString("sky.sql.drop.table.if.exists"));
        SkyTable table = new SkyTable();
        String tableId = IdWorker.getIdStr();
        String tableName = skyTableDo.getTableName();
        BeanUtils.copyProperties(skyTableDo, table);
        table.setId(tableId);
        List<SkyTableColumn> tableColumns = skyTableDo.getTableColumns();
        // 建表
        Boolean aBoolean = CoreUtil.createTable(table, tableColumns);
        // 如果可以更新那么就直接删除表中的字段和表属性信息
        if (existsTable) {
            // 查询是否有对应的表的数据，如果有更新，没有删除
            LambdaQueryWrapper<SkyTable> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(SkyTable::getTableName, tableName);
            SkyTable skyTable = skyTableMapper.selectOne(queryWrapper);
            if (skyTable != null) {
                String skyTableId = skyTable.getId(); // 当前已经存储到数据库的数据ID
                LambdaQueryWrapper<SkyTableColumn> lambdaQueryWrapper = new LambdaQueryWrapper<>();
                lambdaQueryWrapper.eq(SkyTableColumn::getTableId, skyTableId);
                List<SkyTableColumn> skyTableColumns = skyTableColumnMapper.selectList(lambdaQueryWrapper);
                // 删除表对应的字段数据
                for (SkyTableColumn skyTableColumn : skyTableColumns) {
                    skyTableColumnMapper.deleteById(skyTableColumn);
                }
                BeanUtils.copyProperties(table, skyTable);
                skyTable.setId(skyTableId);
                // 更新表数据
                skyTableMapper.updateById(skyTable);
                tableId = skyTableId;
            } else {
                // 将数据插入到配置表中
                skyTableMapper.insert(table);
            }
        }
        // 如果没有配置直接插入
        else {
            skyTableMapper.insert(table);
        }
        // 更新表对应的字段
        for (SkyTableColumn skyTableColumn : tableColumns) {
            skyTableColumn.setTableName(tableName);
            skyTableColumn.setTableId(tableId);
            // 将字段插入数据库
            skyTableColumnMapper.insert(skyTableColumn);
        }
        // 生成表结构
        return aBoolean;
    }

    @Override
    public void generatorTable(String tableName) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/sky", "root", "root")
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("your name") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir("D://"); // 指定输出目录
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent("com.example") // 设置父包名
                            .moduleName("module") // 设置模块名
                    ; // 设置mapperXml生成路径
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("sky_dict") // 设置需要生成的表名
                    ; // 设置过滤表前缀
                })
                .execute();
    }

    @Override
    public void generatorCode(String tableName) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/sky", "root", "root")
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("YourName") // 设置作者
                            .outputDir(System.getProperty("user.dir") + "/src/main/java") // 指定输出目录
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("D:\\document\\code\\sky-robot-generator\\sky-robot-parent\\sky-robot-parent\\sky-robot-dome\\src\\main\\java"); // 指定输出目录
                            ; // 禁止打开输出目录
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent("com.sky") // 设置父包名
                            .moduleName("robot") // 设置模块名
                    ; // 设置mapperXml生成路径
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tableName) // 设置需要生成的表名
                            .entityBuilder().enableLombok(); // 使用 Lombok 注解
                })
                // 自定义模板
                .templateConfig(builder -> {
                    builder.controller("/templates/controller.java.vm"); // 自定义 Controller 模板
                })
                // 使用 Velocity 引擎模板，默认是 Velocity，如果不使用可以注释掉
                .templateEngine(new VelocityTemplateEngine())
                .execute();
    }

}
